
/*
 * @Author: 杨涛 2749552387@qq.com
 * @Date: 2024-10-24 15:55:52
 * @LastEditors: 杨涛 2749552387@qq.com
 * @LastEditTime: 2024-10-25 18:10:59
 * @FilePath: \node-modbus\routes\modbus\meReadWrite.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const express = require('express');
const modbus = express.Router();
const bodyParser = require('body-parser');
const ModbusRTU = require("modbus-serial")
const moment = require('moment')
const {execSQL} = require('../../db/mySqlDb');
// 使用body-parser中间件解析请求体数据
modbus.use(bodyParser.json());
modbus.use(bodyParser.urlencoded({
    extended: false
}));

const table = 'MODBUS_POLL'; // 数据库表名
const config_ModbusRTU = {
    host: "198.120.0.21", // 服务器地址
    port: 502,       // 端口，默认为 502
    unitID: 21        // Modbus 单元标识符
}
// modbus 连接请求封装
const connection = (type,col_obj) => {
    insetMysql(1231) //数据库存储
    return
    const client = new ModbusRTU();
    // 创建Modbus TCP连接，IP是198.120.0.21,端口502
    client.connectTCP(config_ModbusRTU.host, { port: config_ModbusRTU.port });
    client.setID(config_ModbusRTU.unitID);
    return new Promise((resolve, reject) => {
        // 读数据
        if(type == 'read'){
            client.readHoldingRegisters(col_obj.coil, col_obj.result, (err, data) => {
                if (err) return reject(err);
                // insetMysql(data) //数据库存储
                resolve(data);  // ---读取的数据-- 
            });
        }
        // 写数据 num:寄存器 array 写入的数组
        if(type == 'write'){
            client.writeRegisters(col_obj.coil, col_obj.result).then(() => {
                console.log("写入数据 success");
                resolve(200)
            }).catch((err) => {
                console.log("写入数据 失败", err);
                reject("err")
            });
        }
        
    });
}




// 数据库插入数据1
function insetData(params) {
    console.log("insetData", params);
    // 插入数据
    const insertSql = `insert into ${params.table} (time, Alias, num_000) values (?, ?, ?)`;
    const values = [params.time, params.Alias, params.num_000];
    console.log(insertSql); 
    execSQL(insertSql, values).then(result => {
        console.log("添加成功");
    }).catch(err => {
        console.log(err);
    })
}

// 文章列表新增一条数据接口
const insetMysql = (data) => {
    // 检查数据表是否存在
    const time = Date.now().toString();
    let sqlData = {
        table,
        time:moment().format('YYYY年MM月DD日 HH时mm分ss秒'),
        Alias: data,
        num_000: 20
    }
    console.log('12113')
    const checkTableSql = `show tables like '${table}'`;
    execSQL(checkTableSql).then((result) => {
        if (result.length === 0) {
            // 数据表不存在，创建表
            const createTableSql = `create table ${table} (
          id INT PRIMARY KEY AUTO_INCREMENT,   
          time VARCHAR(255),
          Alias VARCHAR(255),
          num_000 VARCHAR(255)
      )`;
            execSQL(createTableSql).then((connection) => {
                insetData(sqlData)
            }).catch((err) => {
                console.log("创建数据表失败");
            })

        } else {
            insetData(sqlData)
        }
    }).catch(err => {
        console.log("添加失败");

    })
}



// 读数据
const read = () => {
    return new Promise((resolve, reject) => {
        client.readHoldingRegisters(0, 10, (err, data) => {  
            if (err) return reject(err);
            // insetMysql(data) //数据库存储
            resolve({
                name: '数据库数据台添加成功',
                data
            });  // ---读取的数据-- 
        });
    });
};

// 读取接口
modbus.all('/readData', async (req, res, next) => {
    try {
        const readResult = await connection('read',{coil:0,result:7}); // 确保传递正确的数组参数  
        res.send({
            name: '读取的数据',
            data: readResult
        });
    } catch (err) {
        res.send({
            name: 'error',
            data: `数据读取失败：${err}`
        });
    }
})
// 写入接口
modbus.all('/writeData', async (req, res, next) => {
    try {
        const writeResult = await connection('write',{coil:5,result:[1, 2, 4]} ); // 确保传递正确的数组参数  
        res.send({
            name: 'success',
            data: writeResult // 发送写入结果作为响应数据  
        });
    } catch (err) {
        res.send({
            name: 'error',
            data: `数据写入失败：${err}`
        });
    }
})
module.exports = modbus;  